home *** CD-ROM | disk | FTP | other *** search
/ PC-Blue - MS DOS Public Domain Library / PC-Blue MS-DOS Public Domain Library - NYACC.iso / vol029 / backup.bas < prev    next >
Encoding:
BASIC Source File  |  1987-01-11  |  6.6 KB  |  201 lines

  1. 1  REM-------------------------------------------------------
  2. 2 REM
  3. 3 REM                    backup.BAS
  4. 4 REM      copy b-tree index file and master data file
  5. 5 REM         remove deleted items in the database
  6. 6 REM--------------------------------------------------------
  7. 7 CLS:KEY OFF
  8. 10 GOTO 1100          'branch to main program
  9. 20 REM ----------------SUROUTINES---------------------
  10. 30 REM
  11. 100 REM--------------------------------------------------
  12. 105 REM
  13. 110 REM                    READ.BAS
  14. 115 REM    INPUT A B-TREE NODE FROM DISK FILE #1
  15. 120 REM---------------------------------------------------
  16. 130 GET 1,P%:LSET REC$=R$
  17. 131 FOR INDEX%=1 TO N%
  18. 132    CH%=SIZE% *(INDEX%-1)
  19. 133    FLAG$=MID$(REC$,CH%+1,1)
  20. 134    IF FLAG$="E" THEN FLAG%(INDEX%)=0
  21. 135    IF FLAG$="F" THEN FLAG%(INDEX%)=1
  22. 136    IF FLAG$="D" THEN FLAG%(INDEX%)=2
  23. 137    KEYS$(INDEX%)=MID$(REC$,CH%+2,SIZE%-3)
  24. 138    ARC%(INDEX%)=CVI(MID$(REC$,CH%+SIZE%-1,2))
  25. 139  NEXT INDEX%
  26. 140 ARC%(N%+1)=CVI(MID$(REC$,126,2))
  27. 145 RETURN
  28. 150 REM-----------------------------------------------------
  29. 155 REM
  30. 160 REM                     WRITE.BAS
  31. 165 REM     OUTPUT A B-TREE NODE TO FILE #1
  32. 170 REM
  33. 175 REM-----------------------------------------------------
  34. 180 FOR INDEX%=1 TO N%
  35. 181   CH%=SIZE% *(INDEX%-1)
  36. 182   ON FLAG%(INDEX%)+1 GOTO 183,184,185
  37. 183    FLAG$="E":GOTO 186
  38. 184    FLAG$="F":GOTO 186
  39. 185    FLAG$="D"
  40. 186   MID$(REC$,CH%+1,1)=FLAG$
  41. 187   MID$(REC$,CH%+2,SIZE%-3)=KEYS$(INDEX%)
  42. 188   MID$(REC$,CH%+SIZE%-1,2)=MKI$(ARC%(INDEX%))
  43. 189 NEXT INDEX%
  44. 190 MID$(REC$,126,2)=MKI$(ARC%(N%+1))
  45. 195 LSET NR$=REC$:PUT G%,LNF%
  46. 199 RETURN
  47. 250 REM--------------------------------------
  48. 251 REM
  49. 252 REM               restore a b-tree node
  50. 253 REM--------------------------------------
  51. 260 FOR INDEX%=1 TO N%+1
  52. 262  FLAG%(INDEX%)=SFLAG%(INDEX%)
  53. 264  KEYS$(INDEX%)=SKEYS$(INDEX%)
  54. 266  ARC%(INDEX%)=SARC%(INDEX%)
  55. 268 NEXT INDEX%
  56. 270 RETURN
  57. 500 REM---------------------------------------------
  58. 501 REM
  59. 502 REM    search b-tree for left-most item, only
  60. 503 REM---------------------------------------------
  61. 510 PRINT:D$="Found": P0%=ROOT%
  62. 515 GOSUB 100          'read a node
  63. 520 IF ARC%(1)=0 THEN 525 ELSE 535
  64. 525   PRINT:LINE INPUT "File is empty. Strike RETURN ";Y$
  65. 530  PRINT:D$="Not found":RETURN
  66. 535 IF ARC%(1)<0 THEN 540 ELSE 545
  67. 540   ITEM%=1 :RETURN
  68. 545 P0%=ARC%(1)
  69. 550 GOTO 515
  70. 700 REM------------------------------------------
  71. 701 REM     read next sequential node
  72. 702 REM------------------------------------------
  73. 710 D$="":P0%=LINK%
  74. 720 IF P0%=0 THEN 725 ELSE 740
  75. 725   PRINT:D$="Done":RETURN
  76. 740 GOSUB 100:ITEM%=1:RETURN
  77. 750 REM----------------------------------------
  78. 751 REM   fill new index file node
  79. 752 REM-----------------------------------------
  80. 755 FOR NI%=NI% TO N%
  81. 760  SKEYS$(NI%)=ZERO$
  82. 765  SFLAG%(NI%)=0
  83. 770  SARC%(NI%)=0
  84. 775 NEXT NI%
  85. 780 IF D$="Done" THEN SARC%(N%+1)=0 ELSE SARC%(N%+1)=LNF%+1
  86. 795 RETURN
  87. 1000 REM------------------------------
  88. 1001 REM  finish up
  89. 1002 REM------------------------------
  90. 1005 REM
  91. 1015 CLOSE 1,2
  92. 1020 OPEN "O",2,"HEADER.DAT"
  93. 1025 PRINT #2,FSCREEN$;",";ROOT%;NPTR%-1;LNF%-1;AN%;LINS%;N%;SIZE%;
  94. 1030 PRINT #2,INDEX$;MAST$
  95. 1035 CLOSE 2
  96. 1040 RETURN
  97. 1100 REM--------------------------------------
  98. 1101 REM    COPY AND GARBAGE COLLECT
  99. 1102 REM--------------------------------------
  100. 1110 OPEN "I",2,"HEADER.DAT"
  101. 1115  INPUT #2,FSCREEN$,ROOT%,LNG%,LNF%,AN%,LINS%,N%,SIZE%,INDEX$,MAST$
  102. 1120 CLOSE 2
  103. 1125 N0%=N%+1:DIM FLAG%(N0%),KEYS$(N0%),ARC%(N0%)
  104. 1130          DIM SFLAG%(N0%),SKEYS$(N0%),SARC%(N0%)
  105. 1135 OPEN "R",1,INDEX$
  106. 1140 FIELD 1, 127 AS R$
  107. 1145 REC$=SPACE$(127):ZERO$=SPACE$(SIZE%-3):LSET ZERO$="0"
  108. 1150 OPEN "R",2,MAST$
  109. 1155   FIELD 2,127 AS MR$
  110. 1200 REM--------------------------------------------
  111. 1201 REM
  112. 1202 REM      NOW THAT THE FILES ARE OPEN, ETC.
  113. 1203 REM      CREATE BACKUP COPIES...
  114. 1204 REM--------------------------------------------
  115. 1270 LINE INPUT"Enter name of backup data file : ";NW$
  116. 1275 LINE INPUT"        Correct (Y/N) ?";Y$
  117. 1280 IF Y$<>"Y" AND Y$<>"y" THEN 1270
  118. 1290 LINE INPUT"Enter name of backup index file : ";OUTDEX$
  119. 1300 LINE INPUT"        Correct (Y/N) ?";Y$
  120. 1310 IF Y$<>"Y" AND Y$<>"y" THEN 1290
  121. 1320 PRINT"Busy working..."
  122. 1330 OPEN "R",3,OUTDEX$
  123. 1340 FIELD 3,127 AS NR$
  124. 1350 G%=3
  125. 1360 OPEN "R",4,NW$
  126. 1370  FIELD 4,127 AS RR$
  127. 1380 GOSUB 500
  128. 1390 IF D$="Not Found" THEN 1395 ELSE 1400
  129. 1395   CLOSE 1,2,3,4 :RUN "dbmenu"
  130. 1400 REM-----------------copy from old master to new--------------------
  131. 1470 NPTR%=1:LNF%=1:ITEM%=1
  132. 1480 REM ----------loop-------------------
  133. 1490  FOR NI%=1 TO N%-1
  134. 1492  IF ITEM%=N% THEN GOSUB 700
  135. 1496  IF D$="Done" THEN 1760
  136. 1500  MPTR%=-ARC%(ITEM%)
  137. 1505  IF MPTR%=0 THEN 1506 ELSE 1510
  138. 1506    ITEM%=ITEM%+1
  139. 1507    GOTO 1492
  140. 1510  IF FLAG%(ITEM%)=2 THEN 1506
  141. 1550  GET 2,MPTR%
  142. 1560  LSET RR$=MR$
  143. 1570  PUT 4,NPTR%
  144. 1580 REM----copy index info-------
  145. 1590  SKEYS$(NI%)=KEYS$(ITEM%)
  146. 1600  SFLAG%(NI%)=1
  147. 1610  SARC%(NI%)=-NPTR%
  148. 1630 REM-----update new master pointer
  149. 1650    NPTR%=NPTR%+1
  150. 1700 REM -----update old index info----------
  151. 1720    ITEM%=ITEM%+1
  152. 1750 NEXT NI%
  153. 1751 PRINT"Calm down, I'm still working on it..."
  154. 1755 IF (KEYS$(ITEM%)=ZERO$) AND (LINK%=0) THEN 1756 ELSE 1760
  155. 1756  D$="Done":SARC%(N%+1)=0
  156. 1760 GOSUB 750:GOSUB 250:GOSUB 150
  157. 1770 LNF%=LNF%+1
  158. 1780  IF D$="Done" THEN 1850 ELSE 1490
  159. 1850 REM------------------------------------------
  160. 1851 REM   close  files and redefine header file
  161. 1852 REM------------------------------------------
  162. 1880 CLOSE 1,2,3,4
  163. 1890 INDEX$=OUTDEX$
  164. 1900 MAST$=NW$
  165. 1910 PRINT"Data file re-organized. Now for the index file..."
  166. 1930 REM--------------do b-tree tier by tier--------------------
  167. 1950 P0%=1:ROOT%=LNF%
  168. 1960 OPEN "R",1,OUTDEX$
  169. 1965 G%=1:FIELD,1127 AS NR$
  170. 1980 REM---------------------find last key and move it up-----------------
  171. 2000 KOUNT%=1:D$=""
  172. 2010 FOR ITEM%=1 TO N%-1
  173. 2020  GOSUB 100:SFAG%(ITEM%)=1
  174. 2030  I%=0
  175. 2031   I%=I%+1
  176. 2032   SKEYS$(ITEM%)=KEYS$(N%-I%)
  177. 2033   IF KEYS$(N%-I%)=ZERO$ THEN 2031
  178. 2060  SARC%(ITEM%)=P0%
  179. 2070  P0%=LINK%
  180. 2080  IF P0%=0 THEN 2100
  181. 2090 NEXT ITEM%
  182. 2100 REM---------finish off node-------------------
  183. 2105 PRINT"You are being so patient..."
  184. 2130 IF P0%=0 THEN 2140 ELSE 2250
  185. 2140  D$="Done":NI%=ITEM%+1:GOSUB 750
  186. 2150  GOSUB 250:GOSUB 150
  187. 2155  P0%=ROOT%:ROOT%=LNG%+1:LNF%=ROOT%
  188. 2160 GOTO 2330
  189. 2200 REM---------------more still to come---------------------------
  190. 2250   KOUNT%=KOUNT%+1
  191. 2255   NI%=N%
  192. 2260   GOSUB 750:GOSUB 250:GOSUB 150
  193. 2270   LNF%=LNF%+1:GOTO 2010
  194. 2330 IF KOUNT%=1 THEN 2340 ELSE 2000
  195. 2340 PRINT"Done at last."
  196. 2390 ROOT%=ROOT%-1:GOSUB 1000
  197. 2400 RUN "dbmenu"
  198. 2500 END
  199. 
  200. 2330 IF KOUNT%=1 THEN 2340 ELSE 2000
  201. 2